package com.hj.sort;

import java.util.Arrays;

/**
 * @author hj
 * @Date 2022/1/5
 * @Description: 堆排序
 */
public class HeapSort {

    public void heapSort(int[] array) {
        if (null == array) {
            return;
        }
        for (int i = array.length / 2 - 1; i >= 0; i--) {
            // 先调整堆(选择一个最大值放到堆顶)
            adjustHeap(array, i, array.length);
        }
        for (int i = array.length - 1; i > 0; i--) {
            // 将堆顶的元素与其他元素比较并交换
            swap(array, i);
            // 再调整堆
            adjustHeap(array, 0, i);
        }
    }

    /**
     * 调整堆，使得堆顶元素值大于等于其子节点值
     *
     * @param array  数组
     * @param top    顶部索引
     * @param length 长度
     */
    private void adjustHeap(int[] array, int top, int length) {
        int temp = array[top];
        for (int i = top * 2 + 1; i < length; i = i * 2 + 1) {
            // （如果存在的话）从左右子节点找出值最大的子节点
            if (i + 1 < length && array[i + 1] > array[i]) {
                i++;
            }
            if (array[i] > temp) {
                array[top] = array[i];
                top = i;
            } else {
                break;
            }
        }
        if (array[top] > temp) {
            array[top] = temp;
        }
    }

    /**
     * 交换
     *
     * @param array 数组
     * @param b     索引
     */
    private void swap(int[] array, int b) {
        int temp = array[0];
        array[0] = array[b];
        array[b] = temp;
    }

    public static void main(String[] args) {
        HeapSort heapSort = new HeapSort();
        int[] array = {5, 9, 125, 6, 85, 97, 45, 3, 25, 64, 36, 98, 103, 45, 12, 35};
        heapSort.heapSort(array);
        System.out.println(Arrays.toString(array));
    }


}
